#if !defined(TITLE_BAR_H__)
#define TITLE_BAR_H__

#pragma once

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QPoint>
#include <QAbstractButton>
#include <QHBoxLayout>

enum ButtonType
{
    MIN_BUTTON = 0,   // 最小化及关闭
    MIN_MAX_BUTTON,   // 最小化、最大化及关闭
    ONLY_CLOSE_BUTTON // 只有关闭按钮
};

/// <summary>
/// 自定义标题栏
/// </summary>
class TitleBar : public QWidget
{
    Q_OBJECT

public:
    TitleBar(QWidget *parent = nullptr);
    ~TitleBar();

    void setTitleIcon(const QString &filePath);        // 设置标题栏图标
    void setTitleContent(const QString &titleContent); // 设置标题栏内容
    void setTitleWidth(int width);
    void setButtonType(ButtonType buttonType);

    bool addButton(QAbstractButton *button);

    void enableMove(bool enable = true);

    void showButtonMax();
    void showButtonRestore();

private:
    void painEvent(QPaintEvent *event); // 绘图事件
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

    void initControl();                            // 初始化控件
    void initConnections();                        // 初始化信号与槽的链接
    void loadStyleSheet(const QString &sheetName); // 加载样式表

signals:
    // 标题栏按钮点击时触发的信号
    void signalButtonMinClicked();
    void signalButtonRestoreClicked();
    void signalButtonMaxClicked();
    void signalButtonCloseClicked();

protected slots:
    // 按钮响应的槽
    void onButtonMinClicked();
    void onButtonRestoreClicked();
    void onButtonMaxClicked();
    void onButtonCloseClicked();

private:
    QHBoxLayout *layout;
    QHBoxLayout *addLayout;

    QLabel *icon;
    QLabel *titleContent;
    QPushButton *btnMin;
    QPushButton *btnMax;
    QPushButton *btnRestore;
    QPushButton *btnClose;

    // 移动窗口的变量
    bool isPressed;
    bool enable_move = false;
    QPoint startMovePos;

    QString titleContentStr; // 标题栏标题内容
    ButtonType buttonType;   // 标题栏右上角按钮类型
};

#endif // TITLE_BAR_H__
